package service;

import controladoresJpa.DicionarioMRJpaController;
import controladoresJpa.exceptions.NonexistentEntityException;
import controladoresJpa.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.DicionarioMR;

/**
 * Módulo MR
 * Essa classe representa os Dicionarios de Dados  do Modelo Relacional.
 * @author Eduardo, Maylon e Kamilla
 */
public class DicionarioMRService  implements Serializable{
	
        private DicionarioMRJpaController jpa;
        private static Logger log = Logger.getLogger(DicionarioMRService.class.getName());

       /**
        * Método construtor da classe  DicionarioMERService
        */
        public DicionarioMRService() {
            jpa = new DicionarioMRJpaController();
        }   
        
        /**
         * Método responsável por salvar e atualizar um dicionário de dados do Modelo Entidade-Relacionamento.
         * @param atributoMER nome do atributo.
         * @throws NonexistentEntityException
         * @throws Exception exceção.
         */
        public void salvar(DicionarioMR dicionarioMR)  {
            //DicionarioMR ddmr = this.recuperarDoBancoDados(dicionarioMR);
            if(dicionarioMR.getId()==-1)
            {
                   dicionarioMR.setAtributoMRList(null);
            try {
                jpa.create(dicionarioMR);
                log.fine("Dicionario MR do esquema: "+ dicionarioMR.getNomeEsquema() +" salvo com sucesso ");
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(DicionarioMRService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(DicionarioMRService.class.getName()).log(Level.SEVERE, null, ex);
            }
            }
            else
                try {
            jpa.edit(dicionarioMR);
            log.fine("Dicionario MR do esquema: "+ dicionarioMR.getNomeEsquema() +" editado ");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(DicionarioMRService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(DicionarioMRService.class.getName()).log(Level.SEVERE, null, ex);
        }

        }
       

         /**
         * Método responsável por excluir um Dicionario do Modelo Entidade-Relacionamento.
         * Ao excluir um dicionario todas as relacionamentos que ele possui serão excluídos.
         * @param dicionarioMER dicionário a ser excluído.
         * @throws NonexistentEntityException
         */
         public void excluir(DicionarioMR dicionarioMR) {
            if(this.encontrado(dicionarioMR))
                try {
            jpa.destroy(dicionarioMR.getId());
            log.fine("Dicionario MR do esquema: "+ dicionarioMR.getNomeEsquema() +" excluido com sucesso ");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(DicionarioMRService.class.getName()).log(Level.SEVERE, null, ex);
        } 
            
         }

        /**
          * Método responsável por buscar todos os dicionários salvos.
          * @return lista de dicionários.
          */
         public List<DicionarioMR> listar() {
            return jpa.findDicionarioMREntities();
         }

      

        /**
         * Método responsável por verificar se um determinaddo dicionário esta salvo.
         * @param dicionarioMER elemento a ser buscado
         * @return true quando encotrado, false quando não seja encotrado
         */
        public boolean encontrado(DicionarioMR dicionarioMR){
            List lst = this.listar();
            Iterator i = lst.iterator();
            boolean achei = false;
            while(!achei && i.hasNext()){
                DicionarioMR a = (DicionarioMR) i.next();
                if(dicionarioMR.getId().equals(a.getId())){
                    log.fine("Dicionario MR do esquema: "+ dicionarioMR.getNomeEsquema() +" encontrado ");
                    return true;
                }
            }
            log.fine("Dicionario MR do esquema: "+ dicionarioMR.getNomeEsquema() +" encontrado ");
            return false;
        } 
    
      /**
      * Método para recuperaçao de dicionarios MR do BD
      * @param objeto
      * @return 
      */
        public DicionarioMR recuperarDoBancoDados(DicionarioMR objeto){
            List lst = jpa.findDicionarioMREntities();
            Iterator i = lst.iterator();
            boolean achei = false;
            while(!achei && i.hasNext()){
                DicionarioMR a = (DicionarioMR) i.next();
                if(objeto.getId().equals(a.getId())){
                    log.fine("Dicionario MR do esquema: "+ objeto.getNomeEsquema() +" encontrado no banco de dados");
                    return a;
                }    
            }
            log.fine("Dicionario MR do esquema: "+ objeto.getNomeEsquema() +" Não encontrado no banco de dados");
            return null;
        }
}
